// 📊 S12 策略：热冷融合 + 冷号周期反弹增强
const _ = require("lodash");

/**
 * @param {Array<{ time: string, number: string }>} temp - 历史开奖数据
 * @returns {string[]} - 返回预测的 32 个号码
 */
function select32NumbersByS12(temp) {
  // ✅ 所有号码（01 ~ 49）
  const allNumbers = Array.from({ length: 49 }, (_, i) =>
    (i + 1).toString().padStart(2, "0")
  );

  // ✅ 1. 统计每个号码出现频率
  const freqMap = {};
  temp.forEach(({ number }) => {
    freqMap[number] = (freqMap[number] || 0) + 1;
  });

  // ✅ 2. 计算每个号码最后一次出现的位置（用于计算未出现期数）
  const lastAppearMap = {};
  for (let i = temp.length - 1; i >= 0; i--) {
    const num = temp[i].number;
    if (!lastAppearMap[num]) {
      lastAppearMap[num] = temp.length - 1 - i;
    }
  }

  // ✅ 3. 热号（按出现频率排序取前20）
  const hotNumbers = allNumbers
    .map((n) => ({
      number: n,
      freq: freqMap[n] || 0,
    }))
    .sort((a, b) => b.freq - a.freq)
    .slice(0, 20)
    .map((x) => x.number);

  // ✅ 4. 冷号（按未出现期数排序，取前12个）
  const coldNumbers = allNumbers
    .filter((n) => !hotNumbers.includes(n)) // 排除热号
    .map((n) => ({
      number: n,
      gap: lastAppearMap[n] !== undefined ? lastAppearMap[n] : temp.length,
    }))
    .sort((a, b) => b.gap - a.gap) // 越久未出现越优先
    .slice(0, 12)
    .map((x) => x.number);

  // ✅ 5. 合并热号 + 冷号，确保唯一性
  const finalNumbers = _.uniq([...hotNumbers, ...coldNumbers]).slice(0, 32);

  return finalNumbers;
}

module.exports = select32NumbersByS12;
